//
//  CZUserModel.swift
//  sinaSwifWeiBo
//
//  Created by 张雪雪 on 16/2/27.
//  Copyright © 2016年 张雪雪. All rights reserved.
//

import UIKit

class CZUserModel: NSObject , NSCoding{
    
    
//    返回值字段	字段类型	字段说明
//    access_token	string	用于调用access_token，接口获取授权后的access token。
//    expires_in	string	access_token的生命周期，单位是秒数。
//    remind_in	string	access_token的生命周期（该参数即将废弃，开发者请使用expires_in）。
//    uid	string	当前授权用户的UID。
    /*
    问题:
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000966017f3'
    */

    var access_token : String?
    
    var expires_in : NSTimeInterval = 0 {
    
    //didSet 外接赋值后,调用这个方法
        didSet{
        
        
        expires_date = NSDate(timeIntervalSinceNow: expires_in)
        
        }
    }
    
    var uid : String?
     //再这个类的基础上添加2个属性
    ///profile_image_url	string	用户头像地址（中图），50×50像素
    var profile_image_url: String?
    ///screen_name	string	用户昵称
    var screen_name: String?
    //定义一个属性记录未来的时间
    var expires_date: NSDate?
    
    
    override init(){
    
       super.init()
    
    }
    
    // 实现了构造方法,默认的构造方法,不再提供
    //kvc 构造函数
    init(dic : [String : NSObject]) {
        //先调用父类的init
        super.init()
        
        //kvc 赋值
        
        setValuesForKeysWithDictionary(dic)
        
    }
    
    //放置崩溃（定义的属性比获取的数据少）
    //    this class is not key value coding-compliant for the key remind_in.'
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    func save(file: String){
    
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        //拼接文件路径
        
        let filePath = (path as NSString).stringByAppendingPathComponent(file)
        
        
        NSKeyedArchiver.archiveRootObject(self, toFile: filePath)

    
    
    }
    
    class func readObject(file: String) -> CZUserModel? {
        
        // 路径
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        let filePath = (path as NSString).stringByAppendingPathComponent(file)
        //接档
        
        // 判断有效期限 -- 返回的是一个秒数?  秒数 + 当前的时间 = 未来的时间
        /*
        如果在有效期内,则返回数据
        没有在有效期,返回nil
        */
        let model = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? CZUserModel
        
        // 判断一下 expires_date是否有值,如果没有值,直接返回nil
        // 如果有值,就和当前时间进行比较
        if let date = model?.expires_date {
            /*
            
            NSComparisonResult
            case OrderedAscending -- 升序 由小到大
            case OrderedSame      -- 相等
            case OrderedDescending -- 降序 有大到小
            */
            // 未来的时间 大 ,现在的时间小, 没有过期
            // 其他的都算过期
            if date.compare(NSDate()) == .OrderedDescending{
                return model
            }else {
                return nil
            }
            
        }
        
        
        return nil
        
        
    }
    

    
    
    func readObject(file:String) -> CZUserModel?{
    
    //路径
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        let filePath = (path as NSString).stringByAppendingPathComponent(file)
        
        //接档
        
        return NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as?
        
            CZUserModel

    }
    
    
    //归档和接档
    //归档-> 把对象以二进制的形式写入到沙盒里

    func encodeWithCoder(aCoder: NSCoder){
    
    aCoder.encodeObject(access_token, forKey: "access_token")
        
        aCoder.encodeObject(expires_date, forKey: "expires_date")
        
        aCoder.encodeObject(uid, forKey: "uid")
        
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        
        aCoder.encodeObject(profile_image_url, forKey: "profile_image_url")
        
      }
    
    //接档 -> 将沙盒里的二进制转换成对象
    // required一个关键字,必须要实现的
    required init?(coder aDecoder: NSCoder){
    
    self.access_token = aDecoder.decodeObjectForKey("access_token") as? String
        
        self.expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
    
    self.uid = aDecoder.decodeObjectForKey("uid") as? String
        
        self.screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        
        self.profile_image_url = aDecoder.decodeObjectForKey("profile_image_url") as? String
    }
    
}



